home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / perl5 / Mail / Field.pm < prev    next >
Text File  |  2008-04-14  |  5KB  |  217 lines

  1. # Copyrights 1995-2008 by Mark Overmeer <perl@overmeer.net>.
  2. #  For other contributors see ChangeLog.
  3. # See the manual pages for details on the licensing terms.
  4. # Pod stripped from pm file by OODoc 1.04.
  5. package Mail::Field;
  6. use vars '$VERSION';
  7. $VERSION = '2.03';
  8.  
  9. use Carp;
  10. use strict;
  11. use Mail::Field::Generic;
  12.  
  13.  
  14. sub _header_pkg_name
  15. {   my $header = lc shift;
  16.     $header    =~ s/((\b|_)\w)/\U$1/g;
  17.  
  18.     if(length($header) > 8)
  19.     {   my @header = split /[-_]+/, $header;
  20.         my $chars  = int((7 + @header) / @header) || 1;
  21.         $header    = substr join('', map {substr $_,0,$chars} @header), 0, 8;
  22.     }
  23.     else
  24.     {   $header =~ s/[-_]+//g;
  25.     }
  26.  
  27.     'Mail::Field::' . $header;
  28. }
  29.  
  30. sub _require_dir
  31. {   my($class,$dir,$dir_sep) = @_;
  32.  
  33.     opendir DIR, $dir
  34.         or return;
  35.  
  36.    my @inc;
  37.  
  38.    foreach my $f (readdir DIR)
  39.    {   $f =~ /^([\w\-]+)/ or next;
  40.        my $p = $1;
  41.        my $n = "$dir$dir_sep$p";
  42.  
  43.        if(-d $n )
  44.        {   _require_dir("${class}::$f", $n, $dir_sep);
  45.        }
  46.        else
  47.        {   $p =~ s/-/_/go;
  48.            eval "require ${class}::$p";
  49.        }
  50.    }
  51.    closedir DIR;
  52. }
  53.  
  54. sub import
  55. {   my $class = shift;
  56.  
  57.     if(@_)
  58.     {   local $_;
  59.         eval "require " . _header_pkg_name($_) || die $@
  60.             for @_;
  61.         return;
  62.     }
  63.  
  64.     my($dir,$dir_sep);
  65.     foreach my $f (keys %INC)
  66.     {   next if $f !~ /^Mail(\W)Field\W/i;
  67.         $dir_sep = $1;
  68.         $dir = ($INC{$f} =~ /(.*Mail\W+Field)/i)[0] . $dir_sep;
  69.         last;
  70.     }
  71.  
  72.     _require_dir('Mail::Field', $dir, $dir_sep);
  73. }
  74.  
  75. # register a header class, this creates a new method in Mail::Field
  76. # which will call new on that class
  77. sub register
  78. {   my $thing  = shift;
  79.     my $method = lc shift;
  80.     my $class  = shift || ref($thing) || $thing;
  81.  
  82.     $method    =~ tr/-/_/;
  83.     $class     = _header_pkg_name $method
  84.     if $class eq "Mail::Field";
  85.  
  86.     croak "Re-register of $method"
  87.     if Mail::Field->can($method);
  88.  
  89.     no strict 'refs';
  90.     *{$method} = sub {
  91.     shift;
  92.     $class->can('stringify') or eval "require $class" or die $@;
  93.     $class->_build(@_);
  94.     };
  95. }
  96.  
  97. # the *real* constructor
  98. # if called with one argument then the `parse' method will be called
  99. # otherwise the `create' method is called
  100.  
  101. sub _build
  102. {   my $self = bless {}, shift;
  103.     @_==1 ? $self->parse(@_) : $self->create(@_);
  104. }
  105.  
  106.  
  107. sub new
  108. {   my $class = shift;
  109.     my $field = lc shift;
  110.     $field =~ tr/-/_/;
  111.     $class->$field(@_);
  112. }
  113.  
  114.  
  115. sub combine {confess "Combine not implemented" }
  116.  
  117. our $AUTOLOAD;
  118. sub AUTOLOAD
  119. {   my $method = $AUTOLOAD;
  120.     $method    =~ s/.*:://;
  121.  
  122.     $method    =~ /^[^A-Z\x00-\x1f\x80-\xff :]+$/
  123.         or croak "Undefined subroutine &$AUTOLOAD called";
  124.  
  125.     my $class = _header_pkg_name $method;
  126.  
  127.     unless(eval "require $class")
  128.     {   my $tag = $method;
  129.         $tag    =~ s/_/-/g;
  130.         $tag    = join '-',
  131.             map { /^[b-df-hj-np-tv-z]+$|^MIME$/i ? uc($_) : ucfirst(lc $_) }
  132.                 split /\-/, $tag;
  133.  
  134.         no strict;
  135.         @{"${class}::ISA"} = qw(Mail::Field::Generic);
  136.         *{"${class}::tag"} = sub { $tag };
  137.     }
  138.  
  139.     Mail::Field->can($method)
  140.         or $class->register($method);
  141.  
  142.     goto &$AUTOLOAD;
  143. }
  144.  
  145.  
  146. # Of course, the functionality should have been in the Mail::Header class
  147. sub extract
  148. {   my ($class, $tag, $head) = (shift, shift, shift);
  149.  
  150.     my $method = lc $tag;
  151.     $method    =~ tr/-/_/;
  152.  
  153.     if(@_==0 && wantarray)
  154.     {   my @ret;
  155.         my $text;  # need real copy!
  156.         foreach $text ($head->get($tag))
  157.         {   chomp $text;
  158.             push @ret, $class->$method($text);
  159.         }
  160.         return @ret;
  161.     }
  162.  
  163.     my $idx  = shift || 0;
  164.     my $text = $head->get($tag,$idx)
  165.         or return undef;
  166.  
  167.     chomp $text;
  168.     $class->$method($text);
  169. }
  170.  
  171.  
  172. # before 2.00, this method could be called as class method, however
  173. # not all extensions supported that.
  174. sub create
  175. {   my ($self, %arg) = @_;
  176.     %$self = ();
  177.     $self->set(\%arg);
  178. }
  179.  
  180.  
  181. # before 2.00, this method could be called as class method, however
  182. # not all extensions supported that.
  183. sub parse
  184. {   my $class = ref shift;
  185.     confess "parse() not implemented";
  186. }
  187.  
  188.  
  189. sub stringify { confess "stringify() not implemented" } 
  190.  
  191.  
  192. sub tag
  193. {   my $thing = shift;
  194.     my $tag   = ref($thing) || $thing;
  195.     $tag =~ s/.*:://;
  196.     $tag =~ s/_/-/g;
  197.  
  198.     join '-',
  199.         map { /^[b-df-hj-np-tv-z]+$|^MIME$/i ? uc($_) : ucfirst(lc $_) }
  200.             split /\-/, $tag;
  201. }
  202.  
  203.  
  204. sub set(@) { confess "set() not implemented" }
  205.  
  206. # prevent the calling of AUTOLOAD for DESTROY :-)
  207. sub DESTROY {}
  208.  
  209.  
  210. sub text
  211. {   my $self = shift;
  212.     @_ ? $self->parse(@_) : $self->stringify;
  213. }
  214.  
  215.  
  216. 1;
  217.